home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / WINER.ZIP / CHAP10-1.BAS < prev    next >
BASIC Source File  |  1992-05-13  |  5KB  |  260 lines

  1. '********** CHAP10-1.BAS - demonstrates various low memory access
  2.  
  3. 'Copyright (c) 1992 Ethan Winer
  4.  
  5. DEFINT A-Z
  6. DECLARE FUNCTION Bin% (Bit$)
  7. DECLARE FUNCTION PeekWord% (BYVAL Segment, BYVAL Address)
  8. DECLARE SUB PokeWord (BYVAL Segment, BYVAL Address, BYVAL Value)
  9.  
  10. CLS
  11. READ NumTests
  12. FOR X = 1 TO NumTests
  13.   READ TestTitle$
  14.   LOCATE X + 5, 20, 1
  15.   PRINT X; TestTitle$
  16. NEXT
  17. DATA 9
  18. DATA Swap serial ports, Swap parallel ports, Test for coprocessor
  19. DATA Count diskette drives, Count serial and parallel ports
  20. DATA Test keyboard flags, Toggle CapsLock, Examine keyboard
  21. DATA Extend drive motor duration
  22.  
  23. PRINT : PRINT TAB(20); "Which test do you want? (Q to Quit): ";
  24.  
  25. DO
  26.   Choice$ = UCASE$(INPUT$(1))
  27.   IF Choice$ = "Q" THEN END
  28.   Choice = VAL(Choice$)
  29. LOOP WHILE Choice = 0 OR Choice > NumTests
  30. PRINT : PRINT : PRINT
  31. ON Choice GOTO Test1, Test2, Test3, Test4, Test5, Test6, Test7, Test8, Test9
  32.  
  33.  
  34. Test1:
  35. '----- exchange COM1 and COM3
  36. Com1 = PeekWord%(0, &H400)
  37. Com3 = PeekWord%(0, &H404)
  38. CALL PokeWord(0, &H400, Com3)
  39. CALL PokeWord(0, &H404, Com1)
  40.  
  41. OPEN "Com1:1200,n,8,1,rs,ds" FOR RANDOM AS #1
  42. PRINT #1, "ATDT 1-555-1212"
  43. CLOSE
  44.  
  45. CALL PokeWord(0, &H400, Com1)
  46. CALL PokeWord(0, &H404, Com3)
  47. END
  48.  
  49.  
  50.  
  51. Test2:
  52. '----- exchange LPT1 and LPT2
  53.  
  54. Lpt1 = PeekWord%(0, &H408)
  55. Lpt2 = PeekWord%(0, &H40A)
  56. CALL PokeWord(0, &H408, Lpt2)
  57. CALL PokeWord(0, &H40A, Lpt1)
  58.  
  59. LPRINT "This is printed on LPT2:"
  60.  
  61. CALL PokeWord(0, &H408, Lpt1)
  62. CALL PokeWord(0, &H40A, Lpt2)
  63.  
  64. LPRINT "And now we're back to LPT1:"
  65. END
  66.  
  67.  
  68.  
  69. Test3:
  70. '----- see if a coprocessor is installed
  71.  
  72. IF PeekWord%(0, &H410) AND 2 THEN
  73.   PRINT "A coprocessor is installed."
  74. ELSE
  75.   PRINT "Sorry, no coprocessor detected."
  76. END IF
  77. END
  78.  
  79.  
  80.  
  81. Test4:
  82. '----- See how many floppy drives there are
  83.  
  84. Equipment = PeekWord%(0, &H410)
  85. Floppies = 1 + (Equipment AND Bin%("11000000")) \ 64
  86. PRINT Floppies; "floppy drive(s) installed"
  87. END
  88.  
  89.  
  90.  
  91. Test5:
  92. '----- See how many serial and parallel ports there are
  93.  
  94. Equipment = PeekWord%(0, &H410)
  95. Serial = (Equipment AND Bin%("11000000000")) \ 512
  96. PRINT Serial; "serial port(s) installed"
  97.  
  98. IF Equipment AND Bin%("1000000000000000") THEN
  99.   HiBitSet = -1
  100. END IF
  101. Parallel = (Equipment AND Bin%("0100000000000000")) \ 16384
  102. IF HiBitSet THEN Parallel = Parallel + 2
  103. PRINT Parallel; "parallel port(s) installed"
  104.  
  105. TotalMem = PeekWord%(0, &H413)
  106. PRINT TotalMem; "KBytes are present"
  107. END
  108.  
  109.  
  110.  
  111. Test6:
  112. CLS
  113. LOCATE , , 0
  114. PRINT "Press the various Shift and Lock keys, ";
  115. PRINT "then press Escape to end this madness."
  116. COLOR 0, 7
  117.  
  118. DO
  119.   Status = PeekWord%(0, &H417)
  120.  
  121.   LOCATE 10, 1
  122.   IF Status AND 1 THEN
  123.     PRINT "RightShift"
  124.   ELSE
  125.     GOSUB ClearIt
  126.   END IF
  127.  
  128.   LOCATE 10, 11
  129.   IF Status AND 2 THEN
  130.     PRINT "Left Shift"
  131.   ELSE
  132.     GOSUB ClearIt
  133.   END IF
  134.    
  135.   LOCATE 10, 21
  136.   IF Status AND 4 THEN
  137.     PRINT "Ctrl key"
  138.   ELSE
  139.     GOSUB ClearIt
  140.   END IF
  141.  
  142.   LOCATE 10, 31
  143.   IF Status AND 8 THEN
  144.     PRINT "Alt key"
  145.   ELSE
  146.     GOSUB ClearIt
  147.   END IF
  148.   
  149.   LOCATE 10, 41
  150.   IF Status AND 16 THEN
  151.     PRINT "ScrollLock"
  152.   ELSE
  153.     GOSUB ClearIt
  154.   END IF
  155.  
  156.   LOCATE 10, 51
  157.   IF Status AND 32 THEN
  158.     PRINT "Num Lock"
  159.   ELSE
  160.     GOSUB ClearIt
  161.   END IF
  162.  
  163.   LOCATE 10, 61
  164.   IF Status AND 64 THEN
  165.     PRINT "Caps Lock"
  166.   ELSE
  167.     GOSUB ClearIt
  168.   END IF
  169.    
  170.   LOCATE 10, 71
  171.   IF Status AND 128 THEN
  172.     PRINT "Insert"
  173.   ELSE
  174.     GOSUB ClearIt
  175.   END IF
  176.  
  177. LOOP UNTIL INKEY$ = CHR$(27)
  178. COLOR 7, 0
  179. END
  180.  
  181. ClearIt:
  182.   COLOR 7, 0
  183.   PRINT SPACE$(10);
  184.   COLOR 0, 7
  185.   RETURN
  186.  
  187.  
  188.  
  189. Test7:
  190. CurStatus = PeekWord%(0, &H417)             'get current status
  191. NewStatus = CurStatus OR Bin%("1000000")    'turn on CapsLock
  192. CALL PokeWord(0, &H417, NewStatus)          'update the status
  193. PRINT "Press a key to turn off CapsLock"
  194.  
  195. WHILE INKEY$ = "": WEND
  196. NewStatus = NewStatus AND Bin%("10111111")  'turn off CapsLock
  197. CALL PokeWord(0, &H417, NewStatus)
  198. END
  199.  
  200.  
  201.  
  202. Test8:
  203. CLS
  204. PRINT "You have two seconds to press a few keys..."
  205. Pause! = TIMER
  206. WHILE Pause! + 2 > TIMER: WEND
  207.  
  208. BufferHead = PeekWord%(0, &H41A)
  209. BufferTail = PeekWord%(0, &H41C)
  210.  
  211. NumKeys = (BufferTail - BufferHead) \ 2
  212. IF NumKeys < 0 THEN NumKeys = NumKeys + 16
  213. PRINT "There are"; NumKeys; "keys pending in the buffer."
  214.  
  215. PRINT "The next key waiting to be read is ";
  216. NextKey = PeekWord%(&H40, BufferHead)
  217. IF NextKey AND &HFF THEN
  218.   PRINT CHR$(34); CHR$(NextKey AND &HFF); CHR$(34)
  219. ELSE
  220.   PRINT "Extended key scan code"; NextKey \ 256
  221. END IF
  222. END
  223.  
  224.  
  225.  
  226. Test9:
  227. CLS
  228. PRINT "Place a diskette in drive A and press a key ";
  229. WHILE INKEY$ = "": WEND
  230. LOCATE , , 0
  231.  
  232. FILES "A:*.*"
  233.  
  234. DEF SEG = 0
  235. POKE &H440, 91  'force drive motor on for five seconds
  236.  
  237. DO
  238.   LOCATE 10, 1
  239.   PRINT PEEK(&H43F),
  240.   PRINT PEEK(&H440)
  241. LOOP WHILE PEEK(&H440)
  242.  
  243. BEEP            'watch the diskette light go out when
  244.                 '  you hear the beep
  245.  
  246. FUNCTION Bin% (Bit$) STATIC
  247.   Temp& = 0
  248.   Length = LEN(Bit$)
  249.   FOR X = 1 TO Length
  250.     IF MID$(Bit$, Length - X + 1, 1) = "1" THEN
  251.       Temp& = Temp& + 2 ^ (X - 1)
  252.     END IF
  253.   NEXT
  254.   IF Temp& > 32767 THEN
  255.     Bin% = Temp& - 65536
  256.   ELSE
  257.     Bin% = Temp&
  258.   END IF
  259. END FUNCTION
  260.